package 基础语法.反射;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Parameter;

public class 反射获取构造方法 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        // 构造方法是在.class字节码文件中的
        Class<MyClass> mClass = (Class<MyClass>) Class.forName("基础语法.反射.MyClass");

        System.out.println(mClass);
        // 获取所有的公共构造方法
        Constructor[] cs = mClass.getConstructors();
        for (Constructor csi : cs) {
            System.out.println(csi);
        }

        // 获取所有的构造方法，包括private修饰的
        Constructor[] cs1 = mClass.getDeclaredConstructors();
        for (Constructor cs1i : cs1) {
            System.out.println(cs1i);
        }

        //获取单个构造方法
        System.out.println();

        Constructor c1=mClass.getConstructor(int.class,int.class);//获取有两个int参数，且是public修饰的构造方法
        System.out.println(c1);
        Constructor c11=mClass.getDeclaredConstructor(int.class);//单个int类型作为参数的构造方法，他是一个private构造方法，用getDeclaredConstructor,不然因为没有定义一个int参数的public方法，就报错
        System.out.println(c11);

        int modifiers=c11.getModifiers();//权限修饰符
        System.out.println(modifiers);
        Parameter[] pr=c11.getParameters();//构造方法的参数列表

        for(Parameter pi:pr){
            System.out.println(pi);
            
        }
        c11.setAccessible(true);//这样就可以使用c11这个私有的构造方法创建对象
        MyClass m=(MyClass) c11.newInstance(2);//使用私有的构造方法创建对象，参数与构造方法保持一致

        System.out.println(m);

    }

}
